home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / bsfengines.jar / com / ibm / bsf / engines / netrexx / NetRexxEngine.class (.txt) next >
Encoding:
Java Class File  |  1999-12-09  |  7.6 KB  |  253 lines

  1. package com.ibm.bsf.engines.netrexx;
  2.  
  3. import COM.ibm.netrexx.process.NetRexxC;
  4. import com.ibm.bsf.BSFDeclaredBean;
  5. import com.ibm.bsf.BSFException;
  6. import com.ibm.bsf.BSFManager;
  7. import com.ibm.bsf.util.BSFEngineImpl;
  8. import com.ibm.bsf.util.BSFFunctions;
  9. import com.ibm.bsf.util.EngineUtils;
  10. import com.ibm.cs.util.JavaUtils;
  11. import com.ibm.cs.util.ReflectionUtils;
  12. import com.ibm.cs.util.StringUtils;
  13. import java.io.File;
  14. import java.io.FileOutputStream;
  15. import java.lang.reflect.InvocationTargetException;
  16. import java.lang.reflect.Method;
  17. import java.util.Hashtable;
  18. import java.util.Vector;
  19. import netrexx.lang.BadArgumentException;
  20. import netrexx.lang.Rexx;
  21.  
  22. public class NetRexxEngine extends BSFEngineImpl {
  23.    BSFFunctions mgrfuncs;
  24.    Class rexxclass;
  25.    private boolean bsfHandleCreated = false;
  26.    static Hashtable codeToClass = new Hashtable();
  27.    static String serializeCompilation = "";
  28.    static String placeholder = "$$CLASSNAME$$";
  29.    String minorPrefix;
  30.    private int uniqueFileOffset;
  31.  
  32.    public NetRexxEngine() {
  33.       new BadArgumentException();
  34.    }
  35.  
  36.    public void initialize(BSFManager var1, String var2, Vector var3) throws BSFException {
  37.       super.initialize(var1, var2, var3);
  38.       this.mgrfuncs = new BSFFunctions(var1, this);
  39.    }
  40.  
  41.    private GeneratedFile openUniqueFile(String var1, String var2, String var3) {
  42.       File var4 = null;
  43.       Object var5 = null;
  44.       FileOutputStream var6 = null;
  45.       short var7 = 1000;
  46.       GeneratedFile var8 = null;
  47.       String var10 = null;
  48.       int var9 = var7;
  49.       ++this.uniqueFileOffset;
  50.  
  51.       while(var6 == null && var9 > 0) {
  52.          try {
  53.             var10 = var2 + this.uniqueFileOffset;
  54.             var4 = new File(var1 + File.separatorChar + var10 + var3);
  55.             File var13 = new File(var1 + File.separatorChar + var10 + ".class");
  56.             if (var4 != null && !var4.exists() & var13 != null & !var13.exists()) {
  57.                var6 = new FileOutputStream(var4);
  58.             }
  59.          } catch (Exception var12) {
  60.             if (!var4.exists()) {
  61.                System.err.println("openUniqueFile: unexpected " + var12);
  62.                ((Throwable)var12).printStackTrace();
  63.             }
  64.          }
  65.  
  66.          --var9;
  67.          ++this.uniqueFileOffset;
  68.       }
  69.  
  70.       if (var6 == null) {
  71.          System.err.println("openUniqueFile: Failed " + var7 + "attempts.");
  72.       } else {
  73.          var8 = new GeneratedFile(this, var4, var6, var10);
  74.       }
  75.  
  76.       return var8;
  77.    }
  78.  
  79.    public Object eval(String var1, int var2, int var3, Object var4) throws BSFException {
  80.       Object var5 = null;
  81.       String var6 = null;
  82.       GeneratedFile var7 = null;
  83.       String var8 = var4.toString();
  84.       String var9 = var8;
  85.  
  86.       try {
  87.          this.rexxclass = (Class)codeToClass.get(var8);
  88.          if (this.rexxclass != null) {
  89.             if (super.debug) {
  90.                System.err.println("NetRexxEngine: Found pre-compiled class for script '" + var8 + "'");
  91.             }
  92.  
  93.             var6 = this.rexxclass.getName();
  94.          } else {
  95.             var7 = this.openUniqueFile(super.tempDir, "BSFNetRexx", ".nrx");
  96.             if (var7 == null) {
  97.                throw new BSFException("couldn't create NetRexx scratchfile");
  98.             }
  99.  
  100.             var6 = var7.className;
  101.             var7.fos.write(("class " + var6 + ";\n").getBytes());
  102.             var7.fos.write("method BSFNetRexxEngineEntry(bsf=com.ibm.bsf.util.BSFFunctions) public static;\n".getBytes());
  103.             int var12;
  104.             if ((var12 = var9.indexOf(placeholder)) >= 0) {
  105.                for(StringBuffer var14 = new StringBuffer(); var12 >= 0; var12 = var9.indexOf(placeholder, var12)) {
  106.                   var14.setLength(0);
  107.                   if (var12 > 0) {
  108.                      var14.append(var9.substring(0, var12));
  109.                   }
  110.  
  111.                   var14.append(var6);
  112.                   int var38 = var12 + placeholder.length();
  113.                   if (var38 < var9.length()) {
  114.                      var14.append(var9.substring(var38));
  115.                   }
  116.  
  117.                   var9 = var14.toString();
  118.                }
  119.             }
  120.  
  121.             for(int var16 = 0; var16 < super.declaredBeans.size(); ++var16) {
  122.                BSFDeclaredBean var40 = (BSFDeclaredBean)super.declaredBeans.elementAt(var16);
  123.                String var15 = StringUtils.getClassName(var40.type);
  124.                var7.fos.write((var40.name + " =" + var15 + "   bsf.lookupBean(\"" + var40.name + "\");").getBytes());
  125.             }
  126.  
  127.             var7.fos.write(var9.getBytes());
  128.             var7.fos.close();
  129.             if (super.debug) {
  130.                System.err.println("NetRexxEngine: wrote temp file " + var7.file.getPath() + ", now compiling");
  131.             }
  132.  
  133.             String var17 = var7.file.getPath();
  134.             if (super.debug) {
  135.                var17 = var17 + " -verbose4";
  136.             } else {
  137.                var17 = var17 + " -noverbose";
  138.             }
  139.  
  140.             var17 = var17 + " -nocompile";
  141.             var17 = var17 + " -noconsole";
  142.             Rexx var18 = new Rexx(var17);
  143.             String var19 = serializeCompilation;
  144.             synchronized(var19){}
  145.  
  146.             try {
  147.                NetRexxC.main(var18);
  148.                String var21 = super.tempDir + File.separatorChar + var6 + ".java";
  149.                if (super.debug) {
  150.                   System.err.println("NetRexxEngine: compiling Java file " + var21);
  151.                }
  152.  
  153.                if (!JavaUtils.JDKcompile(var21, super.classPath)) {
  154.                   throw new BSFException(BSFException.REASON_OTHER_ERROR, "java compilation error");
  155.                }
  156.             } catch (Throwable var28) {
  157.                throw var28;
  158.             }
  159.  
  160.             if (super.debug) {
  161.                System.err.println("NetRexxEngine: loading class " + var6);
  162.             }
  163.  
  164.             this.rexxclass = EngineUtils.loadClass(super.mgr, var6);
  165.             codeToClass.put(var8, this.rexxclass);
  166.          }
  167.  
  168.          Object[] var32 = new Object[]{this.mgrfuncs};
  169.          var5 = this.call((Object)null, "BSFNetRexxEngineEntry", var32);
  170.       } catch (Exception var29) {
  171.          ((Throwable)var29).printStackTrace();
  172.          if (var29 instanceof InvocationTargetException) {
  173.             Throwable var13 = ((InvocationTargetException)var29).getTargetException();
  174.             var13.printStackTrace();
  175.          }
  176.  
  177.          throw new BSFException(BSFException.REASON_IO_ERROR, ((Throwable)var29).getMessage(), var29);
  178.       } finally {
  179.          if (var7 != null && var7.file != null && var7.file.exists()) {
  180.             var7.file.delete();
  181.          }
  182.  
  183.          if (var6 != null) {
  184.             File var33 = new File(super.tempDir + File.separatorChar + var6 + ".java");
  185.             if (var33.exists()) {
  186.                var33.delete();
  187.             }
  188.  
  189.             var33 = new File(super.tempDir + File.separatorChar + var6 + ".class");
  190.             if (var33.exists()) {
  191.                var33.delete();
  192.             }
  193.  
  194.             var33 = new File(super.tempDir + File.separatorChar + var6 + ".crossref");
  195.             if (var33.exists()) {
  196.                var33.delete();
  197.             }
  198.  
  199.             var33 = new File(super.tempDir);
  200.             this.minorPrefix = var6 + "$";
  201.             String[] var39 = var33.list(new 1(this));
  202.             if (var39 != null) {
  203.                int var41 = var39.length;
  204.  
  205.                while(var41 > 0) {
  206.                   --var41;
  207.                   var33 = new File(var39[var41]);
  208.                   var33.delete();
  209.                }
  210.             }
  211.          }
  212.  
  213.       }
  214.  
  215.       return var5;
  216.    }
  217.  
  218.    public Object call(Object var1, String var2, Object[] var3) throws BSFException {
  219.       Object var4 = null;
  220.  
  221.       try {
  222.          if (this.rexxclass != null) {
  223.             Class[] var5 = new Class[var3.length];
  224.  
  225.             for(int var9 = 0; var9 < var3.length; ++var9) {
  226.                var5[var9] = var3[var9].getClass();
  227.             }
  228.  
  229.             Method var7 = ReflectionUtils.getMethod(this.rexxclass, var2, var5);
  230.             var4 = var7.invoke((Object)null, var3);
  231.          } else {
  232.             System.err.println("NetRexxEngine: ERROR: rexxclass==null!");
  233.          }
  234.  
  235.          return var4;
  236.       } catch (Exception var8) {
  237.          ((Throwable)var8).printStackTrace();
  238.          if (var8 instanceof InvocationTargetException) {
  239.             Throwable var6 = ((InvocationTargetException)var8).getTargetException();
  240.             var6.printStackTrace();
  241.          }
  242.  
  243.          throw new BSFException(BSFException.REASON_IO_ERROR, ((Throwable)var8).getMessage(), var8);
  244.       }
  245.    }
  246.  
  247.    public void declareBean(BSFDeclaredBean var1) throws BSFException {
  248.    }
  249.  
  250.    public void undeclareBean(BSFDeclaredBean var1) throws BSFException {
  251.    }
  252. }
  253.